home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / GEM / EVENTHAN.I < prev    next >
Encoding:
Text File  |  1993-05-21  |  22.7 KB  |  3 lines

  1. ⓪ IMPLEMENTATION MODULE EventHandler;⓪ (*$L-, Y+*)⓪ ⓪ (*  Implementation des 'EventHandler's der Megamax Modula-2 Biblothek⓪!*⓪!*  geschrieben von Manuel Chakravarty          Created: 9.9.87⓪!*⓪!*  Version 2.2    V#0129⓪!*)⓪!⓪ (* 09.09.87     | Definitionen⓪!* 13.09.87     | 'InstallWatchDog' und 'DeInstallWatchDog' implementiert⓪!* 21.09.87     | 'commonHandler' und seine Benutzer impl.+ time/msgHdler⓪!* 22.09.87     | 'HandleEvents' impl.⓪!* 28.09.87     | Message-Install's lösen bei einem 'HandleEvents' jetzt⓪!*                autom. eine Abfrage nach Message-Events aus, diese Eve-⓪!*                nts werden falls nicht Abgefangen noch mal mittels⓪!*                'WriteToAppl' gesendet. 'ShareTime' impl.⓪!* 30.09.87     | SysInstall impl.⓪!* 07.11.87     | Anpassung an GEM V 0.10⓪!* 19.01.88 TT  | levelCounter: deInstall korrgiert, searchList optimiert⓪!* 30.03.88     | 'HandleEvents' ruft jetzt bei Msg.events nur noch die⓪!*                Proc's auf, die für den aufgetrettenen Msg.event-Typ⓪!*                angemeldet sind (einzige Ausnahme 'unspecMessage').⓪!* 23.12.88     | 'ReadFromAppl' wird beim message add wirklich nur aufge-⓪!*                rufen, falls die Nachricht länger als 16 Byte ist. Außerdem⓪!*                wird des HIGH-Wert für die open arrays richtig übergeben.⓪!* 01.03.89     | *** Def-Änderung *** auf 2.00. Neu: 'FlushEvents'⓪!* 17.08.89     | 'KeyboardProc' um 'keys' erweitert⓪!* 15.02.90     | Anpassung an Compilerversion 4.0⓪!* 21.05.93 TT  | Reentry bei ShareTime/FlushEvents verhindert.⓪!*)⓪ ⓪ ⓪ FROM SYSTEM     IMPORT ASSEMBLER, WORD,⓪7ADR;⓪ ⓪ FROM Storage    IMPORT ALLOCATE, DEALLOCATE;⓪ ⓪ FROM PrgCtrl    IMPORT EnvlpCarrier, TermCarrier,⓪7CatchProcessTerm, SetEnvelope;⓪ ⓪ FROM ResCtrl    IMPORT RemovalCarrier,⓪7CatchRemoval;⓪ ⓪ FROM MOSGlobals IMPORT OutOfMemory, MemArea;⓪ ⓪ FROM GrafBase   IMPORT Point, Rectangle,⓪7Rect;⓪2⓪ FROM GEMGlobals IMPORT GemChar, MButtonSet, SpecialKeySet;⓪4⓪ IMPORT GEMShare;⓪ ⓪ FROM GEMEnv     IMPORT ApplicationID;⓪ ⓪ FROM AESEvents  IMPORT unspecMessage, menuSelected, windRedraw, windTopped,⓪7windClosed, windFulled, windArrowed, windHSlid,⓪7windVSlid, windSized, windMoved, windNewTop, accOpen,⓪7accClose, Event, EventSet, ArrowedMode, MessageBuffer,⓪7RectEnterMode,⓪7MultiEvent;⓪ ⓪ FROM AESMisc    IMPORT ReadFromAppl, WriteToAppl;⓪ ⓪ ⓪ ⓪ TYPE    ptrCarrier      =POINTER TO carrier;⓪(carrier         =RECORD⓪;proc         :PROC;   (* Da Aufruf per JSR, sind *⓪R* die Param. egal.        *)⓪;CASE (*messageEvent*):BOOLEAN OF⓪=FALSE : |⓪=TRUE  : msgType:CARDINAL|⓪;END;⓪;next         :ptrCarrier;⓪;level        :INTEGER;⓪;(*future     :LONGWORD;*)⓪9END;⓪9⓪ VAR     keyboardList,buttonList,stRectList,⓪(ndRectList,messageList,timerList        :ptrCarrier;⓪(⓪(watchDogExecuted: BOOLEAN; (*  Semaphore between 'FlushEvents' and⓪D*  the watch dog servers. *)⓪(flushExecuted   : INTEGER; (*  semaphore f. FlushEvents/ShareTime *)⓪(⓪(modLevel        : INTEGER;⓪(⓪(voidI           : INTEGER;⓪(⓪(⓪ (*  commonHandler - Führt Handling für 'keyboard', 'mouseButton', 'firstRect'⓪!*                  'secondRect' durch. 'data' sind die Daten, die⓪!*                  an die einzelnen Proc's als Parameter übergeben werden⓪!*                  sollen. 'list' ist die zu bearbeitende Proc-Liste.⓪!*)⓪ (*$J-*)⓪ PROCEDURE commonHandler(REF data: ARRAY OF WORD; list: ptrCarrier): BOOLEAN;⓪ (*$J=*)⓪ ⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -(A3),A0        ; 'list' -> A0⓪(MOVE.W  -(A3),D1        ; HIGH(data) -> D1⓪(MOVE.L  -(A3),A1        ; ADR(data) -> A1⓪(CMPA.L  #NIL,A0⓪(BEQ     endTRUE         ; Leere List -> RETURN TRUE⓪(⓪(MOVE.W  #TRUE, watchDogExecuted⓪ loop⓪(MOVE.W  D1,D2           ; kopiere Param. auf A3-Stack⓪(MOVE.L  A1,A2⓪ loop2⓪(MOVE.W  (A2)+,(A3)+⓪(DBF     D2,loop2⓪(MOVE.L  carrier.proc(A0),A2 ; Hole Proceduraddresse⓪(MOVEM.L D1/A0-A1,-(A7)⓪(JSR     (A2)                ; und springe Userproc. an⓪(MOVEM.L (A7)+,D1/A0-A1⓪(MOVE.L  carrier.next(A0),A0 ; hole Zeiger auf nächstes Listenelement⓪(CMPA.L  #NIL,A0⓪(BEQ     ende            ; Listenende? => Fertig.⓪(TST.W   -(A3)⓪(BNE     loop            ; Falls Userproc. keinen Abbruch wünscht weiter⓪(MOVE.W  #FALSE,(A3)+⓪(BRA     ende⓪(⓪ endTRUE⓪(MOVE.W  #TRUE,(A3)+⓪ ende⓪$END;⓪"END commonHandler;⓪(⓪ (*$J-*)⓪ PROCEDURE keyboardHandler(VAR ch: GemChar; VAR keys: SpecialKeySet): BOOLEAN;⓪ (*$J=*)⓪ ⓪ CONST   noParamB        =8;⓪(noParamW        =noParamB DIV 2 - 1; (* -1, da HIGH mit 0 beginnt *)⓪ ⓪ BEGIN⓪"ASSEMBLER⓪(LEA     -noParamB(A3),A0⓪(MOVE.L  A0,(A3)+⓪(MOVE.W  #noParamW,(A3)+⓪(MOVE.L  keyboardList,(A3)+⓪(JSR     commonHandler⓪(MOVE.W  -(A3),D0⓪(SUBQ.L  #noParamB,A3⓪(MOVE.W  D0,(A3)+⓪"END;⓪ END keyboardHandler;⓪ ⓪ (*$J-*)⓪ PROCEDURE buttonHandler(clicks:CARDINAL;loc:Point;buts:MButtonSet;⓪8specials:SpecialKeySet):BOOLEAN;⓪ (*$J=*)⓪8⓪ CONST   noParamB        =10;⓪(noParamW        =noParamB DIV 2 - 1;⓪ ⓪ BEGIN⓪"ASSEMBLER⓪(LEA     -noParamB(A3),A0⓪(MOVE.L  A0,(A3)+⓪(MOVE.W  #noParamW,(A3)+⓪(MOVE.L  buttonList,(A3)+⓪(JSR     commonHandler⓪(MOVE.W  -(A3),D0⓪(SUBA.W  #noParamB,A3⓪(MOVE.W  D0,(A3)+⓪"END;⓪ END buttonHandler;⓪ ⓪ (*$J-*)⓪ PROCEDURE stRectHandler(loc:Point;buts:MButtonSet;⓪8specials:SpecialKeySet):BOOLEAN;⓪ (*$J=*)⓪ ⓪ CONST   noParamB        =8;⓪(noParamW        =noParamB DIV 2 - 1;⓪ ⓪ BEGIN⓪"ASSEMBLER⓪(LEA     -noParamB(A3),A0⓪(MOVE.L  A0,(A3)+⓪(MOVE.W  #noParamW,(A3)+⓪(MOVE.L  stRectList,(A3)+⓪(JSR     commonHandler⓪(MOVE.W  -(A3),D0⓪(SUBQ.L  #noParamB,A3⓪(MOVE.W  D0,(A3)+⓪"END;⓪ END stRectHandler;⓪ ⓪ (*$J-*)⓪ PROCEDURE ndRectHandler(loc:Point;buts:MButtonSet;⓪8specials:SpecialKeySet):BOOLEAN;⓪ (*$J=*)⓪ ⓪ CONST   noParamB        =8;⓪(noParamW        =noParamB DIV 2 - 1;⓪ ⓪ BEGIN⓪"ASSEMBLER⓪(LEA     -noParamB(A3),A0⓪(MOVE.L  A0,(A3)+⓪(MOVE.W  #noParamW,(A3)+⓪(MOVE.L  ndRectList,(A3)+⓪(JSR     commonHandler⓪(MOVE.W  -(A3),D0⓪(SUBQ.L  #noParamB,A3⓪(MOVE.W  D0,(A3)+⓪"END;⓪ END ndRectHandler;⓪ ⓪ (*$J-*)⓪ PROCEDURE messageHandler(msg:MessageBuffer):BOOLEAN;⓪ (*$J=*)⓪ ⓪ BEGIN⓪"ASSEMBLER⓪(LEA     -16(A3),A0      ; ADR(msg) -> A0⓪(MOVE.W  (A0),D0         ; msg[0] (type of the message) -> D0⓪@; CASE msg[0] OF⓪(CMP.W   #menuSelected,D0⓪(BEQ     copy2⓪(CMP.W   #windRedraw,D0⓪(BEQ     copy5⓪(CMP.W   #windTopped,D0⓪(BEQ     copy1⓪(CMP.W   #windClosed,D0⓪(BEQ     copy1⓪(CMP.W   #windFulled,D0⓪(BEQ     copy1⓪(CMP.W   #windArrowed,D0⓪(BEQ     copy2⓪(CMP.W   #windHSlid,D0⓪(BEQ     copy2⓪(CMP.W   #windVSlid,D0⓪(BEQ     copy2⓪(CMP.W   #windSized,D0⓪(BEQ     copy5⓪(CMP.W   #windMoved,D0⓪(BEQ     copy5⓪(CMP.W   #windNewTop,D0⓪(BEQ     copy1⓪(CMP.W   #accOpen,D0⓪(BEQ     copy1from4⓪(CMP.W   #accClose,D0⓪(BEQ     copy1⓪(⓪(MOVEQ   #unspecMessage,D0  ; keine message vom AES⓪(LEA     (A0),A1⓪(MOVEQ   #7,D1⓪(BRA     cont⓪(⓪ copy1⓪(LEA     6(A0),A1        ; ab msg[3]⓪(MOVEQ   #0,D1           ; 1 Wort⓪(BRA     cont⓪(⓪ copy1from4⓪(LEA     8(A0),A1⓪(MOVEQ   #0,D1⓪(BRA     cont⓪(⓪ copy2⓪(LEA     6(A0),A1⓪(MOVEQ   #1,D1⓪(BRA     cont⓪ ⓪ copy5⓪(LEA     6(A0),A1⓪(MOVEQ   #4,D1⓪(⓪ cont⓪(MOVEQ   #TRUE,D2        ; init. momentanes Ergebnis⓪(MOVE.L  messageList,A2⓪(⓪ loop⓪(CMPA.L  #NIL,A2⓪(BEQ     ende            ; Falls Listenende, dann Fertig.⓪(CMP.W   carrier.msgType(A2),D0⓪(BEQ     typeMatch       ; springe, falls Listenelem.typ = ges. Typ⓪(TST.W   carrier.msgType(A2)⓪(BNE     skipElem        ; springe, falls Listenelem.typ # unspecMessage⓪(MOVEM.L D0-D1/A0-A2,-(A7)⓪(MOVE.L  A0,A1           ; Kopierparam. für 'unspecMessage'⓪(MOVEQ   #7,D1⓪(BRA     loop2⓪(⓪ typeMatch⓪(MOVEM.L D0-D1/A0-A2,-(A7)⓪ loop2⓪(MOVE.W  (A1)+,(A3)+     ; kopiere Param.⓪(DBF     D1,loop2⓪(MOVE.L  carrier.proc(A2),A2⓪(JSR     (A2)            ; springe Userproc. an⓪(MOVEM.L (A7)+,D0-D1/A0-A2⓪(MOVE.W  -(A3),D2        ; neues momentanes Ergebnis -> D2⓪ skipElem⓪(MOVE.L  carrier.next(A2),A2 ; nächstes Listenelem.⓪(TST.W   D2⓪(BNE     loop            ; nochmal, falls momentanes Ergebnis # FALSE⓪(⓪(MOVE.W  #TRUE, watchDogExecuted⓪ ende⓪(MOVE.L  A0,A3           ; A3-Stack korrigieren⓪(MOVE.W  D2,(A3)+        ; momentanes Ergebnis zurückgeben⓪"END;⓪ END messageHandler;⓪ ⓪ (*$J-*)⓪ PROCEDURE timerHandler():BOOLEAN;⓪ (*$J=*)⓪ ⓪ BEGIN⓪"ASSEMBLER⓪(MOVE.L  timerList,A0⓪(CMPA.L  #NIL,A0⓪(BEQ     endTRUE         ; Leere List -> RETURN TRUE⓪(⓪ loop⓪(MOVE.L  carrier.proc(A0),A2 ; Hole Proceduraddresse⓪(MOVE.L  A0,-(A7)⓪(JSR     (A2)                ; und springe Userproc. an⓪(MOVE.L  (A7)+,A0⓪(MOVE.L  carrier.next(A0),A0 ; hole Zeiger auf nächstes Listenelement⓪(CMPA.L  #NIL,A0⓪(BEQ     ende            ; Listenende? => Fertig.⓪(TST.W   -(A3)⓪(BNE     loop            ; Falls Userproc. keinen Abbruch wünscht weiter⓪(MOVE.W  #FALSE,(A3)+⓪(BRA     ende⓪(⓪ endTRUE⓪(MOVE.W  #TRUE,(A3)+⓪ ende⓪"END;⓪ END timerHandler;⓪ ⓪ ⓪ PROCEDURE InstallWatchDog(VAR handle:WatchDogCarrier;proc:EventProc);⓪ ⓪ BEGIN⓪"ASSEMBLER⓪(MOVE.L  -(A3),-(A7)⓪(MOVE.L  -(A3),D0⓪(MOVE.W  D0,-(A7)⓪(SWAP    D0              ; 'proc.event' -> D0⓪(CMP.W   #keyboard,D0    ; CASE proc.event OF⓪(BEQ     installKey⓪(CMP.W   #mouseButton,D0⓪(BEQ     installBut⓪(CMP.W   #firstRect,D0⓪(BEQ.W   installSt⓪(CMP.W   #secondRect,D0⓪(BEQ.W   installNd⓪(CMP.W   #message,D0⓪(BEQ.W   installMsg⓪(CMP.W   #timer,D0⓪(BEQ.W   installTime⓪(TST.W   (A7)+           ; an diesen Punkt kommt man theoretisch nie⓪(TST.L   (A7)+⓪(BRA.W   ende⓪(⓪ installKey                      ; install keyboard watch dog⓪(TST.L   keyboardList⓪(BNE     keyActive       ; jump if 'keyboardList#NIL' (already plugged)⓪(LEA     keyboardHandler,A0⓪(MOVE.L  A0,keyboardPlug ; plug into the 'GEMshare.keyboardPlug'⓪(MOVE.W  #TRUE,keyboardPlugActive⓪ keyActive⓪(MOVE.L  -(A3),A0        ; ADR(handle) -> A0⓪(MOVE.W  modLevel,carrier.level(A0)⓪(MOVE.L  (A7)+,carrier.proc(A0) ; init. carrier and make it first⓪(TST.W   (A7)+                  ; element of the keyboard carrier list⓪(MOVE.L  keyboardList,carrier.next(A0)⓪(MOVE.L  A0,keyboardList⓪(BRA.W   ende⓪(⓪ installBut                      ; install mouse button watch dog⓪(TST.L   buttonList⓪(BNE     butActive⓪(LEA     buttonHandler,A0⓪(MOVE.L  A0,buttonPlug⓪(MOVE.W  #TRUE,buttonPlugActive⓪ butActive⓪(MOVE.L  -(A3),A0⓪(MOVE.W  modLevel,carrier.level(A0)⓪(MOVE.L  (A7)+,carrier.proc(A0)⓪(TST.W   (A7)+⓪(MOVE.L  buttonList,carrier.next(A0)⓪(MOVE.L  A0,buttonList⓪(BRA.W   ende⓪(⓪ installSt⓪(TST.L   stRectList⓪(BNE     stActive⓪(LEA     stRectHandler,A0⓪(MOVE.L  A0,firstRectPlug⓪(MOVE.W  #TRUE,firstRectPlugActive⓪ stActive⓪(MOVE.L  -(A3),A0⓪(MOVE.W  modLevel,carrier.level(A0)⓪(MOVE.L  (A7)+,carrier.proc(A0)⓪(TST.W   (A7)+⓪(MOVE.L  stRectList,carrier.next(A0)⓪(MOVE.L  A0,stRectList⓪(BRA.W   ende⓪(⓪ installNd⓪(TST.L   ndRectList⓪(BNE     ndActive⓪(LEA     ndRectHandler,A0⓪(MOVE.L  A0,secondRectPlug⓪(MOVE.W  #TRUE,secondRectPlugActive⓪ ndActive⓪(MOVE.L  -(A3),A0⓪(MOVE.W  modLevel,carrier.level(A0)⓪(MOVE.L  (A7)+,carrier.proc(A0)⓪(TST.W   (A7)+⓪(MOVE.L  ndRectList,carrier.next(A0)⓪(MOVE.L  A0,ndRectList⓪(BRA     ende⓪(⓪ installMsg                      ; install message event watch dog⓪(TST.L   messageList⓪(BNE     msgActive       ; already plugged ?⓪(LEA     messageHandler,A0 ; if not plug in⓪(MOVE.L  A0,messagePlug⓪(MOVE.W  #TRUE,messagePlugActive⓪ msgActive⓪(MOVE.L  -(A3),A0        ; ADR(handle) -> A0⓪(MOVE.W  modLevel,carrier.level(A0)⓪(MOVE.W  (A7)+,carrier.msgType(A0) ; save type of message event -> handle⓪(MOVE.L  (A7)+,carrier.proc(A0)    ; procedure address -> handle⓪(MOVE.L  messageList,carrier.next(A0) ; insert into message list⓪(MOVE.L  A0,messageList⓪(BRA     ende⓪(⓪ installTime⓪(TST.L   timerList⓪(BNE     timeActive⓪(LEA     timerHandler,A0⓪(MOVE.L  A0,timerPlug⓪(MOVE.W  #TRUE,timerPlugActive⓪ timeActive⓪(MOVE.L  -(A3),A0⓪(MOVE.W  modLevel,carrier.level(A0)⓪(MOVE.L  (A7)+,carrier.proc(A0)⓪(TST.W   (A7)+⓪(MOVE.L  timerList,carrier.next(A0)⓪(MOVE.L  A0,timerList⓪(⓪ ende⓪"END;⓪ END InstallWatchDog;⓪ ⓪ PROCEDURE SysInstallWatchDog(VAR handle:WatchDogCarrier;proc:EventProc);⓪ ⓪ BEGIN⓪"ASSEMBLER⓪(MOVE.L  -12(A3),-(A7)⓪(JSR     InstallWatchDog⓪(MOVE.L  (A7)+,A0⓪(CLR     carrier.level(A0)⓪"END;⓪ END SysInstallWatchDog;⓪ ⓪ PROCEDURE DeInstallWatchDog(VAR handle:WatchDogCarrier);⓪ ⓪ BEGIN⓪"ASSEMBLER⓪(MOVE.L  -(A3),D1⓪(MOVEQ   #5,D0   ; There are 5+1 lists⓪(PEA     keyboardList⓪(PEA     buttonList⓪(PEA     ndRectList⓪(PEA     stRectList⓪(PEA     messageList⓪(PEA     timerList⓪ loop⓪(MOVE.L  (A7)+,A0⓪ loop2⓪(MOVE.L  (A0),A1⓪(CMPA.L  #NIL,A1⓪(BEQ     listEnd⓪(CMP.L   A1,D1⓪(BEQ     foundHandle⓪(LEA     carrier.next(A1),A0⓪(BRA     loop2⓪ listEnd⓪(DBF     D0,loop⓪(BRA     ende                    ; handle was not installed⓪ ⓪ foundHandle⓪(LSL.W   #2,D0           ; pop remaining list pointer from the stack⓪(ADDA.W  D0,A7           ; A7:=A7+D0*4⓪(MOVE.L  carrier.next(A1),(A0)  ; delete 'handle' out of the list⓪(TST.L   timerList⓪(BNE     cont1⓪(CLR.W   timerPlugActive⓪ cont1⓪(TST.L   messageList⓪(BNE     cont2⓪(CLR.W   messagePlugActive⓪ cont2⓪(TST.L   ndRectList⓪(BNE     cont3⓪(CLR.W   secondRectPlugActive⓪ cont3⓪(TST.L   stRectList⓪(BNE     cont4⓪(CLR.W   firstRectPlugActive⓪ cont4⓪(TST.L   buttonList⓪(BNE     cont5⓪(CLR.W   buttonPlugActive⓪ cont5⓪(TST.L   keyboardList⓪(BNE     ende⓪(CLR.W   keyboardPlugActive⓪ ende⓪"END;⓪ END DeInstallWatchDog;⓪ ⓪ PROCEDURE HandleEvents (    noClicks  : CARDINAL;⓪<butMask,⓪<butState  : MButtonSet;⓪<moveDirec1: RectEnterMode;⓪<rect1Size : Rectangle;⓪<moveDirec2: RectEnterMode;⓪<rect2Size : Rectangle;⓪<time      : LONGCARD;⓪8REF procs     : ARRAY OF EventProc;⓪<usedProcs : CARDINAL);⓪8⓪ CONST   procRecSize     = 8; (* Länge des 'eventProc'-Typs *)⓪ ⓪ VAR     msg             : MessageBuffer;⓪(mouseLoc        : Point;⓪(buttons         : MButtonSet;⓪(keyState        : SpecialKeySet;⓪(key             : GemChar;⓪(doneClicks, i   : CARDINAL;⓪(eventResult     : EventSet;⓪(handlerResult   : BOOLEAN;⓪(momEvent        : Event;⓪(⓪(msgAdd          : BOOLEAN;⓪(a7Store         : LONGCARD;⓪7⓪ (*$L+*)⓪ BEGIN⓪"ASSEMBLER⓪8; last used index of 'procs' -> 'usedProcs' and D0⓪(MOVE.W  usedProcs(A6),D0⓪(MOVE.W  procs+4(A6),D1⓪(TST.W   D0⓪(BEQ     takeHigh⓪(SUBQ.W  #1,D0⓪(CMP.W   D0,D1⓪(BCC     cont⓪ takeHigh⓪(MOVE.W  D1,D0⓪ cont⓪(MOVE.W  D0,usedProcs(A6)⓪8; Rufe MultiEvent auf, Ergebnis in 'eventResult'⓪(CLR.W   D1              ; registrierte events⓪(MOVE.L  procs(A6),A0⓪ loop1⓪(MOVE.W  EventProc.event(A0),D2⓪(BSET    D2,D1           ; registriere den gefundenen Event⓪(ADDQ.L  #procRecSize,A0 ; nächstes Arrayelement⓪(DBF     D0,loop1⓪<; Zusätzlich message event falls nötig⓪(CLR.W   msgAdd(A6)⓪(BTST    #message,D1⓪(BNE     noMsgAdd        ; message event schon gesetzt => springe⓪(TST.L   messageList⓪(BEQ     noMsgAdd        ; message Liste leer => springe⓪(MOVE.W  #TRUE,msgAdd(A6); message add erforderlich⓪(BSET    #message,D1⓪ noMsgAdd⓪ ⓪(MOVE.B  D1,(A3)+⓪(ADDQ.L  #1, A3          ; possible events auf den Stack⓪(LEA     noClicks(A6),A0⓪(MOVEQ   #12,D0          ; 'noClicks' bis 'rect2Size' auf den Stack⓪ loop2⓪(MOVE.W  (A0)+,(A3)+⓪(DBF     D0,loop2⓪(LEA     msg(A6),A0⓪(MOVE.L  A0,(A3)+⓪(MOVE.L  time(A6),(A3)+⓪(LEA     mouseLoc(A6),A0⓪(MOVE.L  A0,(A3)+⓪(LEA     buttons(A6),A0⓪(MOVE.L  A0,(A3)+⓪(LEA     keyState(A6),A0⓪(MOVE.L  A0,(A3)+⓪(LEA     key(A6),A0⓪(MOVE.L  A0,(A3)+⓪(LEA     doneClicks(A6),A0⓪(MOVE.L  A0,(A3)+⓪(LEA     eventResult(A6),A0⓪(MOVE.L  A0,(A3)+                ; 'eventResult' als VAR-Parameter⓪(JSR     MultiEvent⓪(MOVE.B  eventResult(A6),D0⓪(⓪8; beachte message add⓪(TST.W   msgAdd(A6)⓪(BEQ.W   noMsgAdd2⓪(BTST    #message,D0⓪(BEQ.W   noMsgAdd2⓪(BCLR    #message,eventResult(A6)⓪(MOVEQ   #0,D0⓪(MOVE.W  msg+4(A6),D0⓪(ADD.L   #16,D0          ; msg[2]+16 (Länge der message) -> D0⓪(MOVE.L  A7,A0⓪(SUBA.L  D0,A0⓪(SUBA.W  #300,A0         ; 300 Byte Sicherheitszone für Stack⓪(CMPA.L  A3,A0⓪(BCC     enoughStack⓪(LEA     a7Store(A6),A0⓪(MOVE.L  A0,(A3)+⓪(MOVE.L  D0,(A3)+⓪(JSR     ALLOCATE⓪(MOVE.L  a7Store(A6),A0  ; ADR(buffer) -> A0⓪(CLR.L   a7Store(A6)     ; Bedeutet: Benötigter Speicher nicht vom Stack⓪(CMPA.L  #NIL,A0⓪(BNE     allocOk⓪(TRAP    #noErrorTrap⓪(DC.W    OutOfMemory⓪(BRA.W   noMsgAdd2⓪ enoughStack⓪(MOVE.L  A7,a7Store(A6)⓪(SUBA.L  D0,A7⓪(MOVE.L  A7,A0           ; ADR(buffer) -> A0⓪ allocOk⓪(MOVE.L  msg(A6),(A0)⓪(MOVE.L  msg+4(A6),4(A0)⓪(MOVE.L  msg+8(A6),8(A0)⓪(MOVE.L  msg+12(A6),12(A0)⓪(⓪(MOVE.L  A0,-(A7)⓪(TST.W   msg+4(A6)⓪(BEQ     noReadFromAppl⓪(⓪(JSR     ApplicationID⓪(MOVE.L  (A7)+,A0⓪(MOVE.L  A0,D0⓪(ADD.L   #16,D0⓪(MOVE.L  D0,(A3)+⓪(MOVE.W  msg+4(A6),(A3)+⓪(SUBQ.W  #1,-2(A3)       ; HIGH-Value is "no. elem.s" - 1⓪(CLR.W   (A3)+⓪(MOVE.L  A0,-(A7)⓪(JSR     ReadFromAppl    ; ReadFromAppl(Appl...ID(),buffer[16..],0)⓪ ⓪ noReadFromAppl⓪(JSR     ApplicationID⓪(MOVE.L  (A7)+,A0⓪(MOVE.L  A0,(A3)+⓪(MOVE.W  msg+4(A6),D0⓪(ADD.W   #16,D0⓪(MOVE.W  D0,(A3)+⓪(SUBQ.W  #1,-2(A3)       ; HIGH-Value is "no. elem.s" - 1⓪(CLR.W   (A3)+⓪(MOVE.L  A0,-(A7)⓪(JSR     WriteToAppl     ; WriteToAppl(ApplicationID(),buffer,0)⓪(MOVE.L  (A7)+,A0⓪(⓪(MOVE.L  a7Store(A6),D0⓪(BEQ     dealloc⓪(MOVE.L  D0,A7⓪(BRA     noMsgAdd2⓪ dealloc⓪(MOVE.L  A0,(A3)+⓪(CLR.L   (A3)+⓪(JSR     DEALLOCATE⓪ noMsgAdd2⓪@; call procs⓪(CLR.W   i(A6)⓪ loop3⓪(MOVE.W  i(A6),D0⓪(MOVE.W  usedProcs(A6),D1⓪(CMP.W   D0,D1⓪(BCS.W   ende⓪(MOVEQ   #0,D2⓪(MOVE.B  eventResult(A6),D2      ; eventResult -> D2⓪(BEQ.W   ende⓪(MOVE.W  D0,D1⓪(MULU    #procRecSize,D1⓪(MOVE.L  procs(A6),A0⓪(ADDA.W  D1,A0⓪(MOVE.W  EventProc.event(A0),D1  ; proc[i].event -> D1⓪(MOVE.W  D1,momEvent(A6)         ; momEvent:=proc[i].event⓪(BTST    D1,D2⓪(BEQ.W   noMatch⓪(MOVE.L  2(A0),A1   ; proc[i].proc -> A1 (proc[i].event#message)⓪(CMP.W   #keyboard,D1⓪(BEQ     keyCall⓪(CMP.W   #mouseButton,D1⓪(BEQ     butCall⓪(CMP.W   #firstRect,D1⓪(BEQ     stRCall⓪(CMP.W   #secondRect,D1⓪(BEQ     ndRCall⓪(CMP.W   #message,D1⓪(BEQ     msgCall⓪(CMP.W   #timer,D1⓪(BEQ.W   tmrCall⓪(BRA.W   noMatch⓪ keyCall⓪(LEA     key(A6),A0⓪(MOVE.L  A0,(A3)+⓪(LEA     keyState(A6),A0⓪(MOVE.L  A0,(A3)+⓪(JSR     (A1)⓪(BRA.W   caseEnd⓪ butCall⓪(MOVE.W  doneClicks(A6),(A3)+⓪(MOVE.L  mouseLoc(A6),(A3)+⓪(MOVE.B  buttons(A6),(A3)+⓪(ADDQ.L  #1, A3⓪(MOVE.B  keyState(A6),(A3)+⓪(ADDQ.L  #1, A3⓪(JSR     (A1)⓪(BRA.W   caseEnd⓪ stRCall⓪ ndRCall⓪(MOVE.L  mouseLoc(A6),(A3)+⓪(MOVE.B  buttons(A6),(A3)+⓪(ADDQ.L  #1, A3⓪(MOVE.B  keyState(A6),(A3)+⓪(ADDQ.L  #1, A3⓪(JSR     (A1)⓪(BRA.W   caseEnd⓪ ⓪ msgCall                 ; in A0 ist noch ADR(proc[i])⓪(MOVE.W  EventProc.msgType(A0),D1⓪(⓪(; Ist die Proc. vom Typ 'uspecMessage', so bekommt sie den Msg.event⓪(; sowieso, egal von welchem Typ er ist.⓪(⓪(CMP.W   #unspecMessage,D1⓪(BEQ     copy8from0⓪(⓪(; Sonst, muß der Typ des Msg.events gleich dem Typ sein, für den die⓪(; Proc. angemeldet ist.⓪(⓪(CMP.W   msg(A6),D1      ; Proc-Typ = Event-Typ ?⓪(BNE.W   noMatch         ; Nein! => Kein Aufruf der Proc.⓪(⓪(CMP.W   #menuSelected,D1⓪(BEQ     copy2⓪(CMP.W   #windRedraw,D1⓪(BEQ     copy5⓪(CMP.W   #windTopped,D1⓪(BEQ     copy1⓪(CMP.W   #windClosed,D1⓪(BEQ     copy1⓪(CMP.W   #windFulled,D1⓪(BEQ     copy1⓪(CMP.W   #windArrowed,D1⓪(BEQ     copy2⓪(CMP.W   #windHSlid,D1⓪(BEQ     copy2⓪(CMP.W   #windVSlid,D1⓪(BEQ     copy2⓪(CMP.W   #windSized,D1⓪(BEQ     copy5⓪(CMP.W   #windMoved,D1⓪(BEQ     copy5⓪(CMP.W   #windNewTop,D1⓪(BEQ     copy1⓪(CMP.W   #accOpen,D1⓪(BEQ     copy1from4⓪(CMP.W   #accClose,D1⓪(BEQ     copy1⓪(BRA.W   noMatch⓪'⓪ copy8from0⓪(LEA     msg(A6),A2⓪(MOVEQ   #7,D1⓪(BRA     doIt⓪(⓪ copy1⓪(LEA     msg+6(A6),A2    ; ab msg[3]⓪(MOVEQ   #0,D1           ; 1 Wort⓪(BRA     doIt⓪(⓪ copy1from4⓪(LEA     msg+8(A6),A2⓪(MOVEQ   #0,D1⓪(BRA     doIt⓪(⓪ copy2⓪(LEA     msg+6(A6),A2⓪(MOVEQ   #1,D1⓪(BRA     doIt⓪ ⓪ copy5⓪(LEA     msg+6(A6),A2⓪(MOVEQ   #4,D1⓪ doIt⓪(MOVE.L  4(A0),A1        ; proc[i].proc -> A1⓪ copyLoop⓪(MOVE.W  (A2)+,(A3)+⓪(DBF     D1,copyLoop⓪(JSR     (A1)⓪(BRA.W   caseEnd⓪ tmrCall⓪(JSR     (A1)⓪ caseEnd⓪(TST.W   -(A3)⓪(BNE     noMatch⓪(MOVE.W  momEvent(A6),D0⓪(BCLR    D0,eventResult(A6)⓪ noMatch⓪(ADDQ.W  #1,i(A6)⓪(BRA.W   loop3⓪ ende⓪"END;⓪ END HandleEvents;⓪ (*$L=*)⓪ ⓪ ⓪ (*$L+*)⓪ ⓪ (*$J-*)⓪ PROCEDURE dummy (): BOOLEAN;⓪ (*$J=*)⓪ ⓪"BEGIN⓪$RETURN TRUE;⓪"END dummy;⓪ ⓪ PROCEDURE ShareTime (time: LONGCARD);⓪"⓪"VAR     theProc: EventProc;⓪"⓪"BEGIN⓪$IF flushExecuted <= 2 THEN (* erlaubt 2 Rekursionslevel *)⓪&INC (flushExecuted);⓪&theProc.event := timer;⓪&theProc.timeHdler := dummy;⓪&HandleEvents(0, MButtonSet{}, MButtonSet{},⓪3lookForEntry, Rect(0,0,0,0), lookForEntry, Rect(0,0,0,0),⓪3time, theProc, 0);⓪&DEC (flushExecuted);⓪$END⓪"END ShareTime;⓪ ⓪ PROCEDURE FlushEvents;⓪ ⓪"BEGIN⓪&REPEAT⓪(watchDogExecuted := FALSE;⓪(ShareTime (0L);⓪&UNTIL NOT watchDogExecuted;⓪"END FlushEvents;⓪"⓪ ⓪8(*  misc. managment  *)⓪8(*  ===============  *)⓪ ⓪ PROCEDURE levelCounter(start,child:BOOLEAN; VAR id:INTEGER);⓪ ⓪"PROCEDURE searchList(list:ptrCarrier);⓪"⓪$VAR  nlist: ptrCarrier;⓪"⓪$BEGIN⓪&WHILE list # NIL DO⓪(nlist:=list^.next;⓪(IF list^.level>=modLevel THEN⓪*ASSEMBLER⓪,MOVE.L  list(A6),(A3)+⓪,JSR     DeInstallWatchDog⓪*END⓪(END;⓪(list:= nlist⓪&END⓪$END searchList;⓪"⓪"BEGIN⓪$IF child THEN⓪&IF start THEN INC(modLevel)⓪&ELSE⓪(searchList(keyboardList);⓪(searchList(buttonList);⓪(searchList(stRectList);⓪(searchList(ndRectList);⓪(searchList(messageList);⓪(searchList(timerList);⓪(DEC(modLevel);⓪&END;⓪$END;⓪"END levelCounter;⓪ ⓪ PROCEDURE termProc;⓪ ⓪"BEGIN⓪$levelCounter(FALSE,TRUE, voidI);⓪"END termProc;⓪ ⓪ PROCEDURE removalProc;⓪"⓪"BEGIN⓪$(*  Current 'modID = 0'. That means all init.s are released.⓪%*)⓪$levelCounter (FALSE, TRUE, voidI);⓪"END removalProc;⓪"⓪ VAR     envlpHdl        : EnvlpCarrier;⓪(termHdl         : TermCarrier;⓪(removalHdl      : RemovalCarrier;⓪(wsp             : MemArea;⓪ ⓪ ⓪ BEGIN⓪"keyboardList := NIL;⓪"buttonList := NIL;⓪"stRectList := NIL;⓪"ndRectList := NIL;⓪"messageList := NIL;⓪"timerList := NIL;⓪"⓪"modLevel := 1;⓪"CatchProcessTerm (termHdl, termProc, wsp);⓪"SetEnvelope (envlpHdl, levelCounter, wsp);⓪"CatchRemoval (removalHdl, removalProc, wsp);⓪ END EventHandler.⓪ ə
  2. (* $FFF7C95C$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$000051E4$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416EÇ$0000516E........T.......T......TT.......T.......T.......T.......T.......T.......T.......$00000B9B$0000515E$00005170$0000519D$0000516E$0000519D$000051AF$00005198$FFEEDCC0$0000527D$00005268$00005195$00005170$000005FA$000000D8$FFEEDCC0œÇâ*)
  3.